/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.solidario.accesodatos.impl;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import org.eclipse.persistence.internal.jpa.EJBQueryImpl;
import org.eclipse.persistence.jpa.JpaEntityManager;
import org.eclipse.persistence.queries.DatabaseQuery;
import org.eclipse.persistence.sessions.DatabaseRecord;
import org.eclipse.persistence.sessions.Session;

import com.solidario.accesodatos.AccesoDatos;
import com.solidario.entidades.Credito;

/**
 *
 * @author Jorge
 */
public class CreditoAccesoDatos extends AccesoDatos<Credito> {
    private EntityManagerFactory factory;
    private EntityManager em;
    
    public CreditoAccesoDatos() {
        super(Credito.class);
        factory = Persistence.createEntityManagerFactory("SolidarioPU");
        em = factory.createEntityManager();
    }
    
    @Override
    protected EntityManager getEntityManager() {
        return em;
    }
    
    public Double totalDeuda(String cedula) throws Exception {
    	Double total = null;
		try {
			final javax.persistence.Query query = em.createNamedQuery("totalDeudaVinculado");
			query.setParameter(1, cedula);
			total = ((BigDecimal) query.getSingleResult()).doubleValue();
		} catch (Exception e) {
			throw new Exception(e);
		}
		return total;
    }
    
    public List<Credito> creditosVinculado(String cedula, Date fechaInicio, Date fechaFin) throws Exception {
    	List<Credito> listaCreditos = null;
		try {
			// Query de asociados
			String consulta = this.obtenerConsulta("creditosVinculado");
			String condiciones = "";
			
			if (fechaInicio != null) {
				condiciones = condiciones.concat(" and cred.fecha >= ? ");
			}
			
			if (fechaFin != null) {
				condiciones = condiciones.concat(" and cred.fecha <= ? ");
			}
			
			consulta = consulta.replace("-parametros_condiciones-", condiciones);
			
			Query query = em.createNativeQuery(consulta, Credito.class);
			query.setParameter(1, cedula);
			
			if (fechaInicio != null) {
				query.setParameter(2, fechaInicio);
				
				if (fechaFin != null) {
					query.setParameter(3, fechaFin);
				}
			} else if (fechaFin != null) {
				query.setParameter(2, fechaFin);
			}
			
			listaCreditos = query.getResultList();
		} catch (Exception e) {
			throw new Exception(e);
		}
		return listaCreditos;
    }

	public List<Credito> creditosPorTipo(String idTipoCredito, Date fechaInicio, Date fechaFin) throws Exception {
		List<Credito> listaCreditos = null;
		try {
			// Query de asociados
			String consulta = this.obtenerConsulta("creditosPorTipo");
			String condiciones = "";
			
			if (fechaInicio != null) {
				condiciones = condiciones.concat(" and cred.fecha >= ? ");
			}
			
			if (fechaFin != null) {
				condiciones = condiciones.concat(" and cred.fecha <= ? ");
			}
			
			consulta = consulta.replace("-parametros_condiciones-", condiciones);
			
			System.out.println("QUERY CONSULTA: " + consulta);
			
			Query query = em.createNativeQuery(consulta, Credito.class);
			query.setParameter(1, idTipoCredito);
			
			if (fechaInicio != null) {
				query.setParameter(2, fechaInicio);
				
				if (fechaFin != null) {
					query.setParameter(3, fechaFin);
				}
			} else if (fechaFin != null) {
				query.setParameter(2, fechaFin);
			}
			
			listaCreditos = query.getResultList();
		} catch (Exception e) {
			throw new Exception(e);
		}
		return listaCreditos;
	}
	
	private String obtenerConsulta(String nombreConsulta) {
		EntityManager em = getEntityManager();
		Query query = em.createNamedQuery(nombreConsulta);

		Session session = em.unwrap(JpaEntityManager.class).getActiveSession();
		DatabaseQuery databaseQuery = ((EJBQueryImpl<?>) query).getDatabaseQuery();
		databaseQuery.prepareCall(session, new DatabaseRecord());
		String sqlString = databaseQuery.getSQLString();
		
		return sqlString;
	}
}
